//
// Created by hamlet on 23-3-11.
//

#ifndef ASSIGNMENT_NLP_MODEL_H
#define ASSIGNMENT_NLP_MODEL_H

#include <Eigen/SparseCore>
#include <FansionML/Model>
#include <unordered_map>

class Model : public FansionML::Model {
public:
    // 清空缓存数据结构以开始预处理
    void clear();

    // 创建一个新类别
    FansionML::IndexT newLabel(const char *name);

    // 开始读取一个新文件的数据
    FansionML::IndexT newFileData(const char *name, FansionML::IndexT label_index);

    // 记录该文件出现的一个单词
    void addWord(const std::string &word, FansionML::IndexT file_index);

    // Step 6
    // 过滤总出现次数小于times次的单词（每次预处理只能调用一次，因为会更改word_name的内容）
    void filterWords(int times);

    // 将数据转换为Eigen库支持的矩阵类型
    void transformToEigen();

    void preprocess(const char *path) override;

    // 计算tf * idf权重
    void calcTfPlusIdf();

private:
    // 构建原始数据的缓存表
    std::vector<FansionML::IndexT> tmp_label;  // 标签索引
    std::unordered_map<std::string, FansionML::IndexT> tmp_word_index;  // 单词索引
    std::vector<int> tmp_word_times;  // 单词总出现次数
    std::vector<std::unordered_map<FansionML::IndexT, int>> tmp_file_word_times;  // 每个文档中单词出现的次数
    std::unordered_map<FansionML::IndexT, FansionML::IndexT> tmp_filtered_word_index;  // 过滤单词后的单词索引转换表
};


#endif //ASSIGNMENT_NLP_MODEL_H
